home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 June / CHIP Haziran 2001.iso / prog / haziran / 19 / setup.exe / data.z / drvload.cpp < prev    next >
C/C++ Source or Header  |  2001-04-11  |  16KB  |  601 lines

  1. #include <windows.h>
  2. #include <stdio.h>
  3. #include "drvload.h"
  4.  
  5. LoadDriver::LoadDriver()
  6. {
  7.     m_h = NULL;
  8.     ClearErr();
  9. }
  10.  
  11. LoadDriver::~LoadDriver()
  12. {
  13. }
  14.  
  15. LoadDriver95::LoadDriver95()
  16. {
  17.     if (!OpenSCMHandle())
  18.         PrintErr("Cannot open service control manager\n");
  19. }
  20.  
  21. LoadDriver95::~LoadDriver95()
  22. {
  23.     if (m_h)
  24.         CloseSCMHandle();
  25. }
  26.  
  27. LoadDriver98::LoadDriver98()
  28. {
  29.     if (!OpenSCMHandle())
  30.         PrintErr("Cannot open service control manager\n");
  31. }
  32.  
  33. LoadDriver98::~LoadDriver98()
  34. {
  35.     //if (m_h)
  36.     //    CloseSCMHandle();
  37. }
  38.  
  39. LoadDriverNT::LoadDriverNT()
  40. {
  41.     if (!OpenSCMHandle())
  42.         PrintErr("Cannot open service control manager\n");
  43. }
  44.  
  45. LoadDriverNT::~LoadDriverNT()
  46. {
  47.     if (m_h)
  48.         CloseSCMHandle();
  49. }
  50.  
  51. BOOL LoadDriver::Init(char *sDriverName, char *sDriverFile, DWORD startLevel, char *sDriverPath, BOOL fUseReg)
  52. {
  53.     if (!m_h)
  54.         return FALSE;
  55.     m_fUseReg = fUseReg;
  56.     m_iStartLevel = startLevel;
  57.     SetPaths (sDriverName, sDriverFile, sDriverPath);
  58.     return TRUE;
  59. }
  60.  
  61. char *LoadDriver::GetLastMsg()
  62.     return m_sLastMsg;
  63. }
  64.  
  65. void LoadDriver::ClearErr()
  66. {
  67.     m_sLastMsg[0] = '\0';
  68.     m_fHasErr = FALSE;
  69.     m_fHasWrn = FALSE;
  70. }
  71.  
  72. void LoadDriver::PrintErr(char *msg)
  73. {
  74.     strcat (m_sLastMsg, msg);
  75.     m_fHasErr = TRUE;
  76. }
  77.  
  78. void LoadDriver::PrintWrn(char *msg)
  79. {
  80.     strcat (m_sLastMsg, msg);
  81.     m_fHasWrn = TRUE;
  82. }
  83.  
  84. BOOL LoadDriver::HasErr()
  85. {
  86.     return m_fHasErr;
  87. }
  88.  
  89. BOOL LoadDriver::HasWrn()
  90. {
  91.     return m_fHasWrn;
  92. }
  93.  
  94. BOOL LoadDriver::HasMsg()
  95. {
  96.     return m_fHasWrn || m_fHasErr;
  97. }
  98.  
  99. // VXDLDR error codes
  100. #define VXDLDR_ERR_OUT_OF_MEMORY    1
  101. #define VXDLDR_ERR_IN_DOS       2
  102. #define VXDLDR_ERR_FILE_OPEN_ERROR  3
  103. #define VXDLDR_ERR_FILE_READ        4
  104. #define VXDLDR_ERR_DUPLICATE_DEVICE 5
  105. #define VXDLDR_ERR_BAD_DEVICE_FILE  6
  106. #define VXDLDR_ERR_DEVICE_REFUSED   7
  107. #define VXDLDR_ERR_NO_SUCH_DEVICE   8
  108. #define VXDLDR_ERR_DEVICE_UNLOADABLE    9
  109. #define VXDLDR_ERR_ALLOC_V86_AREA   10
  110. #define VXDLDR_ERR_BAD_API_FUNCTION 11
  111.  
  112. #define VXDLDR_ERR_MAX          11
  113.  
  114. // VXDLDR driver functions
  115. #define VXDLDR_APIFUNC_GETVERSION   0
  116. #define VXDLDR_APIFUNC_LOADDEVICE   1
  117. #define VXDLDR_APIFUNC_UNLOADDEVICE 2
  118.  
  119. BOOL LoadDriver95::OpenSCMHandle()
  120. {
  121.     if (m_h)
  122.         return FALSE;
  123.     m_h = CreateFile(
  124.         "\\\\.\\VXDLDR",        // device driver name
  125.         0,              // access
  126.         0,              // share mode
  127.         0,              // security attributes
  128.         CREATE_NEW,             // create options
  129.         FILE_FLAG_DELETE_ON_CLOSE,  // flags
  130.         0);             // template
  131.  
  132.     if (m_h==INVALID_HANDLE_VALUE)
  133.         m_h = NULL;
  134.     return m_h!=NULL;
  135. }
  136.  
  137. void LoadDriver95::CloseSCMHandle()
  138. {
  139.     CloseHandle(m_h);
  140.     m_h = NULL;
  141. }
  142.  
  143. BOOL LoadDriver98::OpenSCMHandle()
  144. {
  145.     // currently starting and stoping not supported OpenSCMHandle is empty
  146.     m_h = (HANDLE) 1; // a 'dummy' handle
  147.     return TRUE;
  148. }
  149.  
  150. void LoadDriver98::CloseSCMHandle()
  151. {
  152. }
  153.  
  154. BOOL LoadDriverNT::OpenSCMHandle()
  155. {
  156.     m_h = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
  157.     return m_h!=NULL;
  158. }
  159.  
  160. void LoadDriverNT::CloseSCMHandle()
  161. {
  162.     CloseServiceHandle(m_h);
  163.     m_h = NULL;
  164. }
  165.  
  166. void LoadDriver::SetPaths(char *sDriverName, char *sDriverFile, char *sDriverPath)
  167. {
  168.     strcpy (m_sDriverName, sDriverName);
  169.     strcpy (m_sDriverFile, sDriverFile);
  170.     if (sDriverPath)
  171.         strcpy (m_sDriverPath, sDriverPath);
  172.     else strcpy (m_sDriverPath,"");
  173. }
  174.  
  175. void LoadDriver95::SetPaths(char *sDriverName, char *sDriverFile, char *sDriverPath)
  176. {
  177.     LoadDriver::SetPaths(sDriverName, sDriverFile, sDriverPath);
  178.     if( !sDriverPath)
  179.     {
  180.         char sSystemPath[1024];
  181.         GetSystemDirectory( sSystemPath,sizeof( sSystemPath) );
  182.         if( sSystemPath[ strlen(sSystemPath)-1] != '\\' ) 
  183.             strcat(sSystemPath,"\\");
  184.         sprintf (m_sDriverPath,"%sVmm32\\%s.VXD", sSystemPath, m_sDriverFile);
  185.     }
  186. }
  187.  
  188. void LoadDriver98::SetPaths(char *sDriverName, char *sDriverFile, char *sDriverPath)
  189. {
  190.     LoadDriver::SetPaths(sDriverName, sDriverFile, sDriverPath);
  191.     if( !sDriverPath)
  192.         sprintf (m_sDriverPath, "\\SystemRoot\\System32\\drivers\\%s.SYS", sDriverFile);
  193. }
  194.  
  195. void LoadDriverNT::SetPaths(char *sDriverName, char *sDriverFile, char *sDriverPath)
  196. {
  197.     LoadDriver::SetPaths(sDriverName, sDriverFile, sDriverPath);
  198.     if( !sDriverPath)
  199.         sprintf (m_sDriverPath, "\\SystemRoot\\System32\\drivers\\%s.SYS", sDriverFile);
  200. }
  201.  
  202. BOOL LoadDriver95::Create()
  203. {
  204.     ClearErr();
  205.  
  206.     char sKey[1024];
  207.     sprintf (sKey, "System\\CurrentControlSet\\Services\\VxD\\%s", m_sDriverName);
  208.     // updating registry
  209.     HKEY hKey;
  210.     ULONG rc;
  211.     RegCreateKeyEx (HKEY_LOCAL_MACHINE, sKey,0,"",0,KEY_ALL_ACCESS, NULL, &hKey, &rc);
  212.     if (rc==REG_OPENED_EXISTING_KEY)
  213.     {
  214.         PrintWrn (m_sDriverName);
  215.         PrintWrn (" already exists in Win-95 registry\n");
  216.     }
  217.     else if (rc!=REG_CREATED_NEW_KEY && rc!=ERROR_SUCCESS)
  218.     {
  219.         PrintErr("Cannot open registry key\n");
  220.         return FALSE;
  221.     }
  222.  
  223.     RegSetValueEx (hKey, "Start", 0, REG_BINARY, (PBYTE) "\0", 1);
  224.     char sVal[1024];
  225.     sprintf (sVal, "*%s", m_sDriverFile);
  226.     RegSetValueEx (hKey, "StaticVxD", 0, REG_SZ, (PBYTE) sVal, 9);
  227.  
  228.     RegCloseKey (hKey);
  229.  
  230.     return TRUE;
  231. }
  232.  
  233. BOOL LoadDriver95::Delete()
  234. {
  235.     ClearErr();
  236.     LONG rc;
  237.     char sKey[1024];
  238.     sprintf (sKey, "System\\CurrentControlSet\\Services\\VxD\\%s", m_sDriverName);
  239.     rc = RegDeleteKey (HKEY_LOCAL_MACHINE, sKey);
  240.     if (rc!=ERROR_SUCCESS)
  241.     {
  242.         PrintErr (m_sDriverName);
  243.         PrintErr (" does not exist in Win-95 registry\n");
  244.         return FALSE;
  245.     }
  246.     return TRUE;
  247. }
  248.  
  249. BOOL LoadDriver98::Create()
  250. {
  251.     ClearErr();
  252.  
  253.     char sKey[1024];
  254.     sprintf (sKey, "System\\CurrentControlSet\\Services\\%s", m_sDriverName);
  255.     // updating registry
  256.     HKEY hKey;
  257.     ULONG rc;
  258.     RegCreateKeyEx (HKEY_LOCAL_MACHINE, sKey,0,"",0,KEY_ALL_ACCESS, NULL, &hKey, &rc);
  259.     if (rc==REG_OPENED_EXISTING_KEY)
  260.     {
  261.         PrintWrn (m_sDriverName);
  262.         PrintWrn (" already exists in Win-98 registry\n");
  263.     }
  264.     else if (rc!=REG_CREATED_NEW_KEY && rc!=ERROR_SUCCESS)
  265.     {
  266.         PrintErr("Cannot open registry key\n");
  267.         return FALSE;
  268.     }
  269.  
  270.  
  271.     DWORD val = 2;
  272.     RegSetValueEx (hKey, "Start", 0, REG_BINARY, (PBYTE) &m_iStartLevel, 4);
  273.     val = 1;
  274.     RegSetValueEx (hKey, "Type", 0, REG_BINARY, (PBYTE) &val, 4);
  275.     val = 1;
  276.     RegSetValueEx (hKey, "ErrorControl", 0, REG_BINARY, (PBYTE) &val, 4);
  277. //    RegSetValueEx (hKey, "Group", 0, REG_SZ, (PBYTE) "Extended Base", 14);
  278.     RegSetValueEx (hKey, "ImagePath", 0, REG_SZ, (PBYTE) m_sDriverPath, 41);
  279.     RegSetValueEx (hKey, "DisplayName", 0, REG_SZ, (PBYTE) m_sDriverName, 10);
  280.  
  281.     RegCloseKey (hKey);
  282.  
  283.     return TRUE;
  284. }
  285.  
  286. BOOL LoadDriver98::Delete()
  287. {
  288.     ClearErr();
  289.     LONG rc;
  290.     char sKey[1024];
  291.     sprintf (sKey, "System\\CurrentControlSet\\Services\\%s", m_sDriverName);
  292.     rc = RegDeleteKey (HKEY_LOCAL_MACHINE, sKey);
  293.     if (rc!=ERROR_SUCCESS)
  294.     {
  295.         PrintErr (m_sDriverName);
  296.         PrintErr (" does not exist in Win-98 registry\n");
  297.         return FALSE;
  298.     }
  299.     return TRUE;
  300. }
  301.  
  302. BOOL LoadDriverNT::CreateReg()
  303. {
  304.     ClearErr();
  305.  
  306.     char sKey[1024];
  307.     sprintf (sKey, "System\\CurrentControlSet\\Services\\%s", m_sDriverName);
  308.     // updating registry
  309.     HKEY hKey;
  310.     ULONG rc;
  311.     RegCreateKeyEx (HKEY_LOCAL_MACHINE, sKey,0,"",0,KEY_ALL_ACCESS, NULL, &hKey, &rc);
  312.     if (rc==REG_OPENED_EXISTING_KEY)
  313.     {
  314.         PrintWrn (m_sDriverName);
  315.         PrintWrn (" already exists in Win-NT registry\n");
  316.     }
  317.     else if (rc!=REG_CREATED_NEW_KEY && rc!=ERROR_SUCCESS)
  318.     {
  319.         PrintErr("Cannot open registry key\n");
  320.         return FALSE;
  321.     }
  322.  
  323.     DWORD val = 2;
  324.     RegSetValueEx (hKey, "Start", 0, REG_DWORD, (PBYTE) &m_iStartLevel, 4);
  325.     val = 1;
  326.     RegSetValueEx (hKey, "Type", 0, REG_DWORD, (PBYTE) &val, 4);
  327.     val = 1;
  328.     RegSetValueEx (hKey, "ErrorControl", 0, REG_DWORD, (PBYTE) &val, 4);
  329.     RegSetValueEx (hKey, "Group", 0, REG_SZ, (PBYTE) "Extended Base", 14);
  330.     RegSetValueEx (hKey, "ImagePath", 0, REG_SZ, (PBYTE) m_sDriverPath, 41);
  331.     RegSetValueEx (hKey, "DisplayName", 0, REG_SZ, (PBYTE) m_sDriverName, 10);
  332.  
  333.     RegCloseKey (hKey);
  334.  
  335.     return TRUE;
  336. }
  337.  
  338. BOOL LoadDriverNT::DeleteReg()
  339. {
  340.     ClearErr();
  341.     LONG rc;
  342.     char sKey[1024];
  343.     sprintf (sKey, "System\\CurrentControlSet\\Services\\%s", m_sDriverName);
  344.     rc = RegDeleteKey (HKEY_LOCAL_MACHINE, sKey);
  345.     if (rc!=ERROR_SUCCESS)
  346.     {
  347.         PrintErr (m_sDriverName);
  348.         PrintErr (" does not exist in Win-NT registry\n");
  349.         return FALSE;
  350.     }
  351.     return TRUE;
  352. }
  353.  
  354. BOOL LoadDriver95::Start()
  355. {
  356.     ULONG status, nRet;
  357.  
  358.     if (!m_h)
  359.         return FALSE;
  360.  
  361.     status = DeviceIoControl(
  362.         m_h,                // handle
  363.         VXDLDR_APIFUNC_LOADDEVICE,  // control code (see vxdldr.h in DDK)
  364.         (void *) m_sDriverPath,     // path of vxd file (No \\.\ prefix)
  365.         strlen(m_sDriverPath)+1,    // input size
  366.         NULL,               // output buffer
  367.         0,              // output buffer size
  368.         &nRet,              // receives count returned
  369.         NULL);
  370.     return status==1; 
  371. }
  372.  
  373. BOOL LoadDriver95::Stop()
  374. {
  375.     typedef struct {
  376.             LONG    vxdid;       // device ID of VxD to unload, or -1 to use name
  377.             CHAR    vxdname[256];// null terminated, case sensitive name of VxD 
  378.                                  //   to unload if VxD ID is -1
  379.     } UNLOAD_INFO;
  380.     int i;
  381.             
  382.     UNLOAD_INFO unloadInfo;
  383.     ULONG status, nRet;
  384.  
  385.     if (!m_h)
  386.         return FALSE;
  387.  
  388.     unloadInfo.vxdid = -1;
  389.     strcpy (unloadInfo.vxdname, m_sDriverFile);
  390.     for (i=0; unloadInfo.vxdname[i]; i++)
  391.         unloadInfo.vxdname[i] = toupper(unloadInfo.vxdname[i]);
  392.  
  393.     for (i=0; i<1000; i++)
  394.     {
  395.         status = DeviceIoControl(
  396.             m_h,                // handle
  397.             VXDLDR_APIFUNC_UNLOADDEVICE,    // control code (see vxdldr.h in DDK)
  398.             (void *) &unloadInfo,       // path of vxd file (No \\.\ prefix)
  399.             sizeof (unloadInfo),        // input size
  400.             NULL,               // output buffer
  401.             0,              // output buffer size
  402.             &nRet,              // receives count returned
  403.             NULL);
  404.         if (status!=1)
  405.             break;
  406.     }
  407.     if (i==0)
  408.     {
  409.         PrintWrn("Could not unload driver, or driver was previously loaded.\n");
  410.     }
  411.     return i>0 && i<1000; 
  412. }
  413.  
  414. BOOL LoadDriver98::Start()
  415. {
  416.     PrintWrn("Dynamic Loading of (SYS) driver not available for WIN 98.\n"
  417.          "This is a Windows 98 limitation. Please reboot the system.\n"
  418.          "For a reboot free installation on 98, use the -VXD option\n");
  419.     return FALSE;
  420. }
  421.  
  422. BOOL LoadDriver98::Stop()
  423. {
  424.     PrintWrn("Dynamic unloading of (SYS)driver not available for WIN 98.\n"
  425.          "This is a Windows 98 limitation. Please reboot the system.\n"
  426.          "For a reboot free installation on 98, use the -VXD option\n");
  427.     return FALSE;
  428. }
  429.  
  430. BOOL LoadDriverNT::Create()
  431. {
  432.     SC_HANDLE  sr;
  433.     BOOL fOk = TRUE;
  434.  
  435.     if (m_fUseReg)
  436.         return CreateReg();
  437.  
  438.     if (!m_h)
  439.         return FALSE;
  440.  
  441.     sr = CreateService(
  442.         m_h,    // handle to service control manager database  
  443.         m_sDriverName,  // pointer to name of service to start 
  444.         m_sDriverName,  // pointer to display name 
  445.         SERVICE_ALL_ACCESS, // type of access to service 
  446.         SERVICE_KERNEL_DRIVER,  // type of service 
  447.         m_iStartLevel,  // when to start service 
  448.         SERVICE_ERROR_NORMAL,   // severity if service fails to start 
  449.         m_sDriverPath,  // pointer to name of binary file 
  450.         NULL,   // pointer to name of load ordering group 
  451.         NULL,   // pointer to variable to get tag identifier 
  452.         NULL,   // pointer to array of dependency names 
  453.         NULL,   // pointer to account name of service 
  454.         NULL    // pointer to password for service account 
  455.     );  
  456.     if (sr==NULL) fOk = FALSE;
  457.  
  458.     if (sr) CloseServiceHandle (sr);
  459.  
  460.     return fOk;
  461. }
  462.  
  463. BOOL LoadDriverNT::Start()
  464. {
  465.     SC_HANDLE  sr;
  466.     BOOL fOk = TRUE;
  467.  
  468.     if (!m_h)
  469.         return FALSE;
  470.  
  471.     sr = OpenService(m_h ,m_sDriverName,SERVICE_ALL_ACCESS );
  472.  
  473.     if (sr==NULL)
  474.     {
  475.         fOk = FALSE;
  476.     }
  477.     else
  478.     {
  479.         BOOL rc = StartService (
  480.             sr,    // service identifier
  481.             0,             // number of arguments
  482.             NULL           // pointer to arguments
  483.         );
  484.  
  485.         if (!rc) fOk = FALSE;
  486.     }
  487.  
  488.     if (sr) CloseServiceHandle (sr);
  489.  
  490.     return fOk;
  491. }
  492.  
  493. BOOL LoadDriverNT::Stop()
  494. {
  495.     SC_HANDLE  sr;
  496.     BOOL fOk = TRUE;
  497.     SERVICE_STATUS  serviceStatus;
  498.  
  499.     sr = OpenService(m_h ,m_sDriverName ,SERVICE_ALL_ACCESS );
  500.  
  501.     if (sr==NULL) 
  502.         fOk = FALSE;
  503.  
  504.     if (sr)
  505.     {
  506.         BOOL rc = ControlService ( sr ,SERVICE_CONTROL_STOP ,&serviceStatus );
  507.         if( !rc )
  508.         {
  509.             if( ERROR_SERVICE_NOT_ACTIVE == GetLastError() )
  510.                 rc = TRUE;
  511.         }
  512.  
  513.         if( SERVICE_STOPPED != serviceStatus.dwCurrentState)
  514.             rc = FALSE;
  515.         if (!rc) fOk = FALSE;
  516.     }
  517.  
  518.     if (sr) CloseServiceHandle ( sr );
  519.  
  520.     return fOk;
  521. }
  522.  
  523. BOOL LoadDriverNT::Delete()
  524. {
  525.     SC_HANDLE  sr;
  526.     BOOL fOk = TRUE;
  527.  
  528.     if (m_fUseReg)
  529.         return DeleteReg();
  530.  
  531.     sr = OpenService(m_h ,m_sDriverName,SERVICE_ALL_ACCESS );
  532.  
  533.     if (sr==NULL) 
  534.         fOk = FALSE;
  535.  
  536.     if (sr)
  537.     {
  538.         DWORD rc = DeleteService( sr );
  539.  
  540.         if ( ! rc)
  541.         {
  542.             switch( GetLastError() )
  543.             {
  544.             case ERROR_ACCESS_DENIED:// The specified handle was not opened with DELETE access.
  545.                 break ;
  546.             case ERROR_SERVICE_MARKED_FOR_DELETE:// The specified service has already been marked for deletion
  547.                 rc = TRUE;
  548.                 break;
  549.             }
  550.         }
  551.  
  552.         if (!rc) fOk = FALSE;
  553.     }
  554.     
  555.     if (sr) CloseServiceHandle ( sr );
  556.  
  557.     return fOk;
  558. }
  559.   
  560. LoadDriver *NewLoadDriver(BOOL fVxd)
  561. {
  562.     OSVERSIONINFO lVerInfo;
  563.     BOOL fIsWindows98orLater;
  564.     lVerInfo.dwOSVersionInfoSize = sizeof (lVerInfo);
  565.     if (!GetVersionEx (&lVerInfo)) 
  566.     {
  567.         //printf ("Cannot get OS version\n");
  568.         return NULL;
  569.     }
  570.  
  571.     fIsWindows98orLater = (lVerInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) &&
  572.                       ((lVerInfo.dwMajorVersion > 4) || ((lVerInfo.dwMajorVersion == 4) && (lVerInfo.dwMinorVersion > 0)));
  573.  
  574.  
  575.     switch (lVerInfo.dwPlatformId)
  576.     {
  577.         case VER_PLATFORM_WIN32_NT:
  578.             if (fVxd)
  579.             {
  580.                 //printf ("-vxd is not supported on WinNT");
  581.                 break;
  582.             }
  583.             return new LoadDriverNT();
  584.             break;
  585.  
  586.         case VER_PLATFORM_WIN32_WINDOWS:
  587.             if(fIsWindows98orLater && !fVxd)
  588.                 return new LoadDriver98();
  589.             else
  590.                 return new LoadDriver95();
  591.             break;
  592.  
  593.         default:
  594.             //printf ("This program can run only on Win95/Win98/WinNT/2000");
  595.             break;
  596.     }    
  597.     return NULL;
  598. }
  599.  
  600.